//每个面包屑有一个列表，面包屑属于多实例插件
//列表项含有的基本属性有 index，name,isFirst,isLast,isHeader
//(表示一个默认节点，如  文件列表>root>folder1，文件列表则是header节点)
//面包屑的操作通过事件来触发
//事件有刷新Refresh，跳转goto,返回上一级back,添加新的节点add,无条件清空面包屑clear

define(["knockout", "komapping", "durandal/app"], function(ko, komapping, app) {
	var wrapItem = function(item) {
		item.index = 0;
		item.isFirst = false;
		item.isLast = false;
		item.isHeader = false;
		item = komapping.fromJS(item);
		return item;
	}

	function Breadcrumb(config) {
		var self = this;
		self.navList = ko.observableArray([]); //导航列表
		self.name = ko.observable(null); //导航名称
		self.current = ko.observable(null); //导航的当前对象,一定是最后一个
		if(typeof config === "string") {
			self.name(config);
		}
		if(typeof config === "object") {
			if(config.name) self.name(config.name);
			if(config.header) {
				self.add(config.header,true);
			}
		}
	}
	Breadcrumb.addMethod("refresh", function() {
		var self = this;
		if(self.current()===null) throw new Error('面包屑为空，不能触发刷新')
		app.trigger('navbar.refresh.'+self.name(),ko.toJS(self.current()));
	});
	//有event对象表示通过原生dom事件触发，需要通过ko.contextFor获取上下文
	//如果没有则表示通过直接调用goto方法或者自定义事件调用
	Breadcrumb.addMethod("goto", function(index, event) {
		var self = null;
		if(event) {
			self = ko.contextFor(event.target).$parent;
		} else {
			self = this;
		}
		if(typeof index === "string" || typeof index === "number") {
			index = parseInt(index);
		}
		if(typeof index === "object") {
			index = index.index();
		}
		if(self.navList().length === 0 ||
			self.navList()[self.navList().length - 1].index() < index ||
			self.navList()[0].index() > index) {
			throw new RangeError('不在可跳转的范围内');
		}
		self.navList(self.navList.slice(0, index + 1));
		var listLength = self.navList().length;
		var last = self.navList()[listLength - 1];
		last.isLast(true);
		if(listLength === 1) last.isFirst(true);
		self.current(last);
		app.trigger('navbar.goto.'+self.name(),ko.toJS(self.current()));
	})
	Breadcrumb.addMethod("back", function() {
		var self = this;
		//如果没有项或者只有显示头项
		if(self.navList().length === 1 || (self.navList().length === 2 && self.navList()[0].index() === -1)) {
			throw new RangeError('已无面包屑，不能执行后退操作');
		} else {
			self.goto(self.current().index() - 1);
			app.trigger('navbar.back.'+self.name(),ko.toJS(self.current()));
		}
	});
	Breadcrumb.addMethod("add", function(item,isheader) {
		var self = this;
		var list = self.navList();
		var length = list.length;
		item = wrapItem(item);
		if(length === 0) {
			item.isFirst(true);
			item.isLast(true);
			item.index(0);
		} else {
			var last = self.current();
			last.isLast(false);
			item.isLast(true);
			item.index(last.index() + 1);
		}
		if(isheader){
			item.isHeader(true);
			item.index(-1);
		}
		self.current(item);
		self.navList.push(item);
		app.trigger('navbar.add.'+self.name(),ko.toJS(self.current()));
	});
	Breadcrumb.addMethod("clear", function() {
		this.navList.removeAll();
		this.current(null);
		app.trigger('navbar.clear.'+self.name());
	});

	return Breadcrumb;
})